package com.jxtc.enterprise.tenant.service;


import com.alibaba.fastjson.JSONObject;
import com.jxtc.enterprise.common.config.AppAuthConfig;
import com.jxtc.enterprise.common.entity.Store;
import com.jxtc.enterprise.common.enums.SupplyModeEnum;
import com.jxtc.enterprise.common.exception.HttpClientException;
import com.jxtc.enterprise.common.exception.InsertFailureException;
import com.jxtc.enterprise.common.mapper.StoreMapper;
import com.jxtc.enterprise.common.utils.HttpClientUtil;
import com.jxtc.enterprise.common.utils.Result;
import com.jxtc.enterprise.tenant.vo.req.MerchantCreateReqVo;
import com.jxtc.enterprise.tenant.vo.req.MerchantSupplyModeUpdateReqVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

@Service
@RequiredArgsConstructor
@Slf4j
public class TenantStoreManageService {

    private final StoreMapper storeMapper;

    private final AppAuthConfig appAuthConfig;
    private final HttpClientUtil httpClientUtil;

    /**
     * 在团餐系统中新增店铺，返回新增后的店铺 ID。并根据 verifyFlag 判断向认证服务中新增还是编辑店主信息
     *
     * @param store      店铺信息
     * @param tenantId   租户 ID
     * @param verifyFlag 认证标志，1：店主信息存在，2：店主信息不存在。当 verifyFlag 为 1 时，更新认证服务中店主的供餐模式，verifyFlag 为 2 时，在认证服务中新增店主信息
     * @return 新增后的店铺 ID
     */
    @Transactional(rollbackFor = InsertFailureException.class)
    public String addNewStore(Store store, String tenantId, int verifyFlag) {
        int insertCount = storeMapper.insert(store);
        if (insertCount != 1) {
            // 新增店铺失败时，向前端返回错误提示信息，并触发回滚
            log.error("/addNewStore, 店铺信息新增失败, insertCount: {}, tenantId: {}, storeEntity: {}", insertCount, tenantId, JSONObject.toJSONString(store));
            throw new InsertFailureException("店铺信息新增失败，请稍后重试");
        }
        String storeId = store.getId();
        if (verifyFlag == 2) {
            // 如果店主信息不存在，则调用认证服务新增店主信息
            String host = appAuthConfig.getUrl();
            String url = host + "/jxtc/customer/auth/merchantAuth/register";
            // 构建请求体
            MerchantCreateReqVo merchantCreateReqVo = buildMerchantCreateReqVo(store, tenantId);
            try {
                // 向认证服务发送 HTTP 请求
                Result<?> result = httpClientUtil.post(url, null, merchantCreateReqVo, new ParameterizedTypeReference<Result<Void>>() {
                });
                // 如果认证服务未返回响应结果过状态码不为 200，则记录日志并向前端返回错误提示信息
                if (result == null || result.getCode() != 200) {
                    log.error("/addNewStore, 认证服务新增店主信息失败, tenantId: {}, storeId: {}, merchantCreateReqVo: {}, result: {}",
                            tenantId, storeId, JSONObject.toJSONString(merchantCreateReqVo), JSONObject.toJSONString(result));
                    String errorMessage = "新增店主信息失败";
                    if (result != null && StringUtils.hasText(result.getMessage())) {
                        // 如果认证服务返回了错误提示信息，那么以认证服务中的错误提示信息为准
                        errorMessage = result.getMessage();
                    }
                    throw new InsertFailureException(errorMessage);
                }
            } catch (HttpClientException e) {
                // 认证服务异常时，返回错误提示信息并记录日志
                log.error("/addNewStore, 认证服务新增店主信息失败, 服务异常: {}", e.getMessage());
                throw new InsertFailureException("认证服务异常，请联系管理员排查");
            }
        } else if (verifyFlag == 1) {
            // 如果店主信息存在，则调用认证服务更新店主的供餐模式
            String host = appAuthConfig.getUrl();
            String url = host + "/jxtc/customer/auth/merchantManage/editMerchantSupplyMode";
            // 构建请求体
            MerchantSupplyModeUpdateReqVo merchantSupplyModeUpdateReqVo = new MerchantSupplyModeUpdateReqVo();
            // 更新店主供餐模式时，需要将当前系统的供餐模式添加到店主表中
            merchantSupplyModeUpdateReqVo.setSupplyMode(SupplyModeEnum.ENTERPRISE.getValue());
            merchantSupplyModeUpdateReqVo.setEnterpriseModeTenantId(tenantId);
            merchantSupplyModeUpdateReqVo.setPhone(store.getMerchantPhone());
            try {
                // 向认证服务发送 HTTP 请求
                Result<?> result = httpClientUtil.post(url, null, merchantSupplyModeUpdateReqVo, new ParameterizedTypeReference<Result<Void>>() {
                });
                // 如果认证服务未返回响应结果过状态码不为 200，则记录日志并向前端返回错误提示信息
                if (result == null || result.getCode() != 200) {
                    log.error("/addNewStore, 认证服务更新店主供餐模式失败, tenantId: {}, storeId: {}, merchantSupplyModeUpdateReqVo: {}, result: {}",
                            tenantId, storeId, JSONObject.toJSONString(merchantSupplyModeUpdateReqVo), JSONObject.toJSONString(result));
                    String errorMessage = "更新店主供餐模式失败，请稍后重试";
                    if (result != null && StringUtils.hasText(result.getMessage())) {
                        // 如果认证服务返回了错误提示信息，那么以认证服务中的错误提示信息为准
                        errorMessage = result.getMessage();
                    }
                    throw new InsertFailureException(errorMessage);
                }
            } catch (HttpClientException e) {
                // 认证服务异常时，返回错误提示信息并记录日志
                log.error("/addNewStore, 认证服务更新店主供餐模式失败, 服务异常: {}", e.getMessage());
                throw new InsertFailureException("认证服务异常，请联系管理员排查");
            }
        }

        return storeId;
    }

    private static MerchantCreateReqVo buildMerchantCreateReqVo(Store store, String tenantId) {
        MerchantCreateReqVo merchantCreateReqVo = new MerchantCreateReqVo();
        merchantCreateReqVo.setPhone(store.getMerchantPhone());
        merchantCreateReqVo.setName(store.getMerchantName());
        merchantCreateReqVo.setPassword(store.getMerchantLoginPasswd());
        merchantCreateReqVo.setStoreName(store.getName());
        // 新增店主信息时，以发起请求的后端系统为供餐模式即可，当前为：公司团餐
        merchantCreateReqVo.setSupplyMode(SupplyModeEnum.ENTERPRISE.getValue());
        merchantCreateReqVo.setEnterpriseTenantId(tenantId);
        return merchantCreateReqVo;
    }
}
